
/*
 * File:   PSO.h
 * Author: werty
 *
 * Created on 27 kwiecień 2011, 23:10
 */
#ifndef MOPSO_H
#define MOPSO_H

#include <QDateTime>
#include <QVector>
#include <QtAlgorithms>
#include "Particle.h"
#include "muParser.h"
#include "muParserInt.h"
#include "Problem.h"
#include "uzyteczne_funkcje.h"

class MOPSO
{
    public:
        bool                maximize;
        double              fitness_gbest;
        double              gbest_pos[2];
        double              c_g, c_p;
        double              vmax;
        double              xmin, xmax, ymin, ymax;
        double              x_width, y_width;
        double              xVal, yVal;        // zmienne dla parsera
        double              czi, w;
        int                 il_zmiennych;
        int                 il_funkcji;
        int                 il_ograniczen;
        int                 max_iter;
        int                 num_iter;
        mu::Parser          parser;
        Problem *           problem;
        QVector<Particle *> populacja;
        QVector<Particle *> pbests;
        QVector<Particle *> repozytorium;
        int                 il_hiperkostek;    // na ile czesci dzielimy kazdy wymiar w przestrzeni funkcji kryt.
        float *             min_fitness, *max_fitness, *dx_fitness;

        void generuj_kostki();

        QDateTime            time;
        QVector<Hiperkostka> hiperkostki;

        MOPSO();

        MOPSO(int wiel_pop, Problem * problem);

        MOPSO(const MOPSO & orig);

        virtual ~MOPSO();

        int losuj_kostke_ruletka();
        void aktualizuj_wartosci();
        void aktualizuj_predkosci();
        void aktualizuj_pozycje();
        void aktualizuj_pbest();
        void aktualizuj_repozytorium();
        void mutuj(int gen, int il_gen, double wsp_mutacji);
        void sprawdz_ograniczenia();
        void sprawdz_zdominowanie();
        void wyswietl_repozytorium();
        void wyswietl_populacje();
        void Inicjuj();
        void Iteruj();

    private:
};
#endif   /* PSO_H */
